//
//  XFPSquareNewsViewModel.swift
//  WeiBoReDo
//
//  Created by 放学跟鸽走 on 2017/4/16.
//  Copyright © 2017年 放学跟鸽走. All rights reserved.
//

import Foundation

/// 鸽友圈视图模型
class XSquareNewsViewModel {
    
    ///鸽友圈模型
    var squareNews:XSquareNews?
    
    
    /// 微博正文的属性文本
    var statusAttrText: NSAttributedString?
    
    /// 转发文字的属性文本
    var retweetedAttrText: NSAttributedString?
    
    /// 行高
    var rowHeight: CGFloat = 0
    //如果有转发微博，一定没有图
    
    /// 图片数组
    var picURLs:[XSquarePic]?{
        if squareNews?.media_tp == 0{
            var list = [XSquarePic]()
            //不是视频，可以去看看有没有图片
            //先看看是不是转发
            var images:String?
            let id  = squareNews?.forwardId ?? 0
            if  id > 0 {
                //说明是转发
                images = squareNews?.forwardContent?.media_Src
            }else{
                images = squareNews?.media_small_src
            }
            let array = images?.components(separatedBy: ",")
            for i in array ?? []{
                if i.isEmpty{
                    continue
                }
                list.append(XSquarePic(thumbnail_pic: i))
            }
            
            return list
            
        }else{
            //是视频，
            return nil
        }
    }
    /// 返回视频对象，对象中有封面图片和视频地址
    var media:XSquareAudio?{
        let audio = XSquareAudio()
        let array = squareNews?.media_small_src?.components(separatedBy: ",")
        audio.audioUrl = array?[0]
        audio.faceImageUrl = array?[1]
        return audio
    }
    /// 配图视图的大小
    var picViewSize:CGSize =  CGSize()
    
    
    /// 初始化新闻视图模型
    ///
    /// - Parameter model: XGardenNews
    init(model:XSquareNews){
        self.squareNews = model
        
        
        // --- 设置微博文本 ---
        let originalFont = UIFont.systemFont(ofSize: 15)
        let retweetedFont = UIFont.systemFont(ofSize: 14)
        
        // 微博正文的属性文本
        statusAttrText = CZEmoticonManager.shared.emoticonString(string: model.Content ?? "", font: originalFont)
        
        // 设置被转发微博的属性文本
        let rText = "@" + (squareNews?.forwardContent?.tpName ?? "")
            + ":"
            + (squareNews?.forwardContent?.content ?? "")
        retweetedAttrText = CZEmoticonManager.shared.emoticonString(string: rText, font: retweetedFont)
        //配图,有原创的就计算原创的，没有原创的就计算转发的
        picViewSize = calcPictureViewSize(count: picURLs?.count)
        
        
        // 计算行高
        updateRowHeight()
    }
    /// 根据当前的视图模型内容计算行高
    func updateRowHeight() {
        // 原创微博：顶部分隔视图(12) + 间距(12) + 图像的高度(34) + 间距(12) + 正文高度(需要计算) + 配图视图高度(计算) + 间距(12) ＋ 底部视图高度(35)
        // 被转发微博：顶部分隔视图(12) + 间距(12) + 图像的高度(34) + 间距(12) + 正文高度(需要计算) + 间距(12)+间距(12)+转发文本高度(需要计算) + 配图视图高度(计算) + 间距(12) ＋ 底部视图高度(35)
        let margin: CGFloat = 12
        let iconHeight: CGFloat = 34
        let toolbarHeight: CGFloat = 35
        
        var height: CGFloat = 0
        
        let viewSize = CGSize(width: UIScreen.cz_screenWidth() - 2 * margin, height: CGFloat(MAXFLOAT))
        
        // 1. 计算顶部位置
        height = 2 * margin + iconHeight + margin
        
        // 2. 正文属性文本的高度
        if let text = statusAttrText {
            
            height += text.boundingRect(with: viewSize, options: [.usesLineFragmentOrigin], context: nil).height
        }
        
        // 3. 判断是否转发微博
        if squareNews?.forward != nil{
            
            height += 2 * margin
            
            // 转发文本的高度 - 一定用 retweetedText，拼接了 @用户名:微博文字
            if let text = retweetedAttrText {
                
                height += text.boundingRect(with: viewSize, options: [.usesLineFragmentOrigin], context: nil).height
            }
        }
        
        // 4. 配图视图
        height += picViewSize.height
        
        height += margin
        
        // 5. 底部工具栏
        height += toolbarHeight
        
        // 6. 使用属性记录
        rowHeight = height
    }
    /// 计算指定数量的图片对应的配图视图的大小
    ///
    /// - parameter count: 配图数量
    ///
    /// - returns: 配图视图的大小
    private func calcPictureViewSize(count: Int?) -> CGSize {
        
        if count == 0 || count == nil {
            return CGSize()
        }
        
        // 计算高度
        // 1> 根据 count 知道行数 1 ~ 9
        /**
         1 2 3 = 0 1 2 / 3 = 0 + 1 = 1
         4 5 6 = 3 4 5 / 3 = 1 + 1 = 2
         7 8 9 = 6 7 8 / 3 = 2 + 1 = 3
         */
        let row = (count! - 1) / 3 + 1
        
        // 2> 根据行数算高度
        var height = XStatusPictureViewOutterMargin
        height += CGFloat(row) * XStatusPictureItemWidth
        height += CGFloat(row - 1) * XStatusPictureViewInnerMargin
        
        return CGSize(width: XStatusPictureViewWidth, height: height)
    }
   
   
    /// 使用单个图像，更新配图视图的大小
    ///
    /// 新浪针对单张图片，都是缩略图，但是偶尔会有一张特别大的图 7000 * 9000 多
    /// 新浪微博，为了鼓励原创，支持`长微博`，但是有的时候，有特别长的微博，长到宽度只有1个点
    ///
    /// - parameter image: 网路缓存的单张图像
    func updateSingleImageSize(image: UIImage) {
        
        var size = image.size
        
        let maxWidth: CGFloat = 200
        let minWidth: CGFloat = 40
        
        // 过宽图像处理
        if size.width > maxWidth {
            // 设置最大宽度
            size.width = 200
            // 等比例调整高度
            size.height = size.width * image.size.height / image.size.width
        }
        
        // 过窄图像处理
        if size.width < minWidth {
            size.width = minWidth
            
            // 要特殊处理高度，否则高度太大，会印象用户体验
            size.height = size.width * image.size.height / image.size.width / 4
        }
        
        // 过高图片处理，图片填充模式就是 scaleToFill，高度减小，会自动裁切
        if size.height > 200 {
            size.height = 200
        }
        
        // 特例：有些图像，本身就是很窄，很长！-> 定义一个 minHeight，思路同上！
        // 在工作中，如果看到代码中有些疑惑的分支处理！千万不要动！
        
        // 注意，尺寸需要增加顶部的 12 个点，便于布局
        size.height += XStatusPictureViewOutterMargin
        
        // 重新设置配图视图大小
        picViewSize = size
        
        // 更新行高
        updateRowHeight()
    }
    
}
